#include "lv_task_test.h"   //char 和  chart的意思不同
#include "lvgl.h"
#include "bsp_led.h"
#include "bsp_beep.h" 
#include "bsp_usart.h" 
#include "bsp_systick.h"
#include <stdio.h>

typedef struct{
    char name[20];
    uint8_t age;
}USER_DATA;

lv_task_t * task1=NULL;   //创建任务对象指针,并对其进行初始化(赋值为NULL)
USER_DATA user_data={ //user_data为用户自定义参数,数据结构一般为结构体
    .name={"xiong jia yu"},   //给数组赋值(数组初始化)
    .age=25,   //注意这种特殊的赋值方式
};  //注意给元素赋值的过程,后面得加;号


/**
 * @brief  任务回调函数
 * @param  task :指向任务对象的指针
 * @retval 无
 */
void task1_cb(lv_task_t *task)
{                               //这里的task->user_data是一个void指针
    USER_DATA *dat=(USER_DATA *)(task->user_data);  //获取用户自定义参数

    //打印tick时间(一个tick为1ms)和用户自定义参数  lv_tick_get()函数确保获取到最新的tick值
    printf("task1_cb_tick:%d,name:%s,age:%d\r\n",lv_tick_get(),dat->name,dat->age);  
    BEEP(ON);
    SysTick_Delay_Ms(30);
    BEEP(OFF);       
}


/**
 * @brief  例程入口函数(事件开始测试) 编码使用UTF-8
 * @param  无   
 * @retval 无
 */
void lv_task_test_start(void)
{
    //创建任务  返回任务对象(用任务对象指针指向它)
    task1=lv_task_create(task1_cb,5000,LV_TASK_PRIO_MID,&user_data);
}

/********人是得分层次的  *********/

/**
 * @brief  K1处理函数
 * @param  void
 * @retval void
 */
void Key1Press(void)
{
    if(task1==NULL)
    {
        return;
    }
    /**
     *  使任务复位,如果你以固定的时间间隔不断的重复按下KEY1键
     *  (间隔时间要小于5000ms的回调周期),你会发现task1_cb回调函数再也得不到运行了
     *  ,因为task1任务在被重复性的复位,每一次复位将会导致重新等待一个完整的回调周期
     */
    lv_task_reset(task1);
    printf("task_reset_tick:%d\r\n",lv_tick_get());
}

//做一件事请之前是否得认真考虑一下

/**
 * @brief  K2����������
 * @param  ��
 * @retval ��
 */
void Key2Press(void)
{
    /**
     *  使任务立即准备就绪,当你按下KEY1键时,你会发现task1_cb回调函数会在下一个
     *  lv_task_handler调用时被立即运行,通过串口打印,你会发现
     *  task_ready_tick的值比task_cb_tick的值只小几个数   ????s怎样了解
     */
    lv_task_ready(task1);   
    printf("task_ready_tick:%d\r\n",lv_tick_get());
}

/*疑人不用，用人不疑*/

/**
 * @brief  K3����������
 * @param  ��
 * @retval ��
 */
void Key3Press(void)
{  
    //删除任务,当你按下KEY2键后,你会发现task1_cb回调函数将永远不会再被执行了
    lv_task_del(task1);
    task1=NULL;
    printf("task_del_tick:%d\r\n",lv_tick_get());
}


/**
 * @brief  按键动作函数(在key_driver函数中调用)
 * @param  keycode 键码
 * @retval 无
 */
void KeyAction(uint8_t keycode)
{
    switch (keycode)
    {
        case 1:Key1Press();break;
        case 2:Key2Press();break;
        case 3:Key3Press();break;
        default:break;
    }
}

